/*
* Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
* All Rights Reserved.
* Qualcomm Atheros Confidential and Proprietary.
*/

#ifndef __VOSS_WRAPPER_H
#define __VOSS_WRAPPER_H

#ifdef __cplusplus
extern "C" {
#endif

/*===========================================================================
  @file VossWrapper.h

  @brief This header file contains the various structure definitions and 
  function prototypes for the RTOS abstraction layer, implemented for VOSS

  Copyright (c) 2008 QUALCOMM Incorporated.
  All Rights Reserved.
  Qualcomm Confidential and Proprietary
===========================================================================*/

/*=========================================================================== 
    
                       EDIT HISTORY FOR FILE 
   
   
  This section contains comments describing changes made to the module. 
  Notice that changes are listed in reverse chronological order. 
   
   
  $Header:$ $DateTime: $ $Author: $ 
   
   
  when        who    what, where, why 
  --------    ---    --------------------------------------------------------
  12/15/08    sho    Resolved warnings and errors from AMSS compiler when
                     this is ported to WM
  11/20/08    sho    Renamed this to VossWrapper.h; remove all dependencies
                     on WM platform and allow this to work on all VOSS enabled
                     platforms
  06/24/08    tbh    Modified the file to remove the dependecy on HDD files as 
                     part of Gen6 bring up process. 
  10/29/02 Neelay Das Created file. 
     
===========================================================================*/ 

/*---------------------------------------------------------------------------
 * Include Files
 * ------------------------------------------------------------------------*/

#include "sirTypes.h"
#include "sirParams.h"
#include "sysDef.h"
#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
#include "halDataStruct.h"
#endif
#include "aniDbgTest.h"
#include "vos_timer.h"
#include "palApi.h"
#include "vos_types.h"
#ifdef FEATURE_WLAN_INTEGRATED_SOC
#include "vos_trace.h"
#include "vos_memory.h"
#endif

/* Interlocked Compare Exchange related definitions */



/* Define basic constants for the ThreadX kernel.  */

#define TX_NO_WAIT          0
#define TX_WAIT_FOREVER     0xFFFFFFFFUL
#define TX_AUTO_ACTIVATE    1
#define TX_NO_ACTIVATE      0



/* API return values.  */
#define TX_SUCCESS          0x00
#define TX_QUEUE_FULL    0x01
// ...
#define TX_NO_INSTANCE      0x0D
// ...
#define TX_TIMER_ERROR      0x15
#define TX_TICK_ERROR       0x16
// ...


#ifndef true
#define true                1
#endif

#ifndef false
#define false               0
#endif

/* Following macro specifies the number of milliseconds which constitute 1 ThreadX timer tick. Used
   for mimicking the ThreadX timer behaviour on VOSS. */
// Use the same MACRO used by firmware modules to calculate TICKs from mSec
// Mismatch would cause worng timer value to be programmed
#define TX_MSECS_IN_1_TICK  SYS_TICK_DUR_MS

// Signature with which the TX_TIMER struct is initialized, when the timer is created
#define TX_AIRGO_TMR_SIGNATURE   0xDEADBEEF


/* Just #define out the thread and queue specific threadX calls, since the plan is to keep
   the Windows port of the MAC non-threaded */

#define  tx_thread_create(a, b, c, d, e, f, g, h, i)
#define  tx_thread_delete(a)
#define  tx_thread_resume(a)

// Please note that for the Windows implementation for this routine the time is specified in terms of
// microseconds and not timer ticks. Also, the DDK recommends that this routine should not be called with
// sleep durations of more than 50 usecs.
#define  tx_thread_sleep(uSecs)

#define  tx_thread_suspend(a)
#define  tx_thread_terminate(a)
#define  tx_thread_identify() NULL

#define  tx_queue_create(a, b, c, d, e) TX_SUCCESS
#define  tx_queue_delete(a) TX_SUCCESS
#define  tx_queue_get_ptr(a)    TX_SUCCESS
#define  tx_queue_flush(a)  TX_SUCCESS
#define  tx_queue_receive(a, b, c)  TX_SUCCESS
#define  tx_queue_send(a, b, c) TX_SUCCESS

#define  tx_disable_intr()
#define  tx_enable_intr() 


#define TX_DISABLE_INTR tx_disable_intr()
#define TX_ENABLE_INTR  tx_enable_intr()

#ifdef TIMER_MANAGER
#define  tx_timer_create(a, b, c, d, e, f, g)   tx_timer_create_intern_debug((v_PVOID_t)pMac, a, b, c, d, e, f, g, __FILE__, __LINE__)
#else
#define  tx_timer_create(a, b, c, d, e, f, g)   tx_timer_create_intern((v_PVOID_t)pMac, a, b, c, d, e, f, g)
#endif


/*-------------------------------------------------------------------------*/
/*  ThreadX structures are not mapped to Windows structures for the        */
/*  following reasons:                                                     */
/*      - Windows structures are written in C and they are not C++ aware.  */
/*      - There should not be any dependency between MAC FW include tree   */
/*        and Windows include tree.                                        */
/*                                                                         */
/*  Instead, ThreadX structures are defined here as void*.  This will be   */
/*  used by the wrapper functions to save the pointer of the actual Windows*/
/*  structure.  Windows structure is allocated in ?                        */
/*-------------------------------------------------------------------------*/

typedef v_PVOID_t TX_THREAD;
typedef v_PVOID_t TX_QUEUE;
typedef v_PVOID_t TX_MUTEX;

/*--------------------------------------------------------------------*/
/* Semaphore structure                                                */
/* This structure is used to mimic the binary semaphore functionality */
/* available on ThreadX.                                              */
/*--------------------------------------------------------------------*/
typedef v_SLONG_t TX_SEMAPHORE;

/*--------------------------------------------------------------------*/
/* Timer structure                                                    */
/* This structure is used to implement ThreadX timer facility.  Just  */
/* like ThreadX, timer expiration handler executes at the highest     */
/* possible priority level, i.e. DISPATCH_LEVEL.                      */
/*--------------------------------------------------------------------*/
typedef struct TX_TIMER_STRUCT
{
#ifdef WLAN_DEBUG
#define TIMER_MAX_NAME_LEN 50
    char timerName[TIMER_MAX_NAME_LEN];
#endif
    v_ULONG_t  tmrSignature;
    v_VOID_t   (*pExpireFunc)(v_PVOID_t, tANI_U32);
    tANI_U32   expireInput;
    v_ULONG_t  initScheduleTimeInMsecs;
    v_ULONG_t  rescheduleTimeInMsecs;
    vos_timer_t vosTimer;

    // Pointer to the MAC global structure, which stores the context for the NIC,
    // for which this timer is supposed to operate.
    v_PVOID_t  pMac;
    tANI_U8 sessionId;

} TX_TIMER;

#define TX_TIMER_VALID(timer) (timer.pMac != 0)

typedef struct sAniSirTxWrapper
{
    // Back pointer to the pAdapter structure, needed for some of the internal routines
    v_PVOID_t  pAdapter;

} tAniSirTxWrapper, *tpAniSirTxWrapper;



extern v_ULONG_t tx_time_get(v_VOID_t);
extern v_UINT_t  tx_timer_activate(TX_TIMER*);
extern v_UINT_t  tx_timer_change(TX_TIMER*, v_ULONG_t, v_ULONG_t);
extern v_UINT_t  tx_timer_change_context(TX_TIMER*, tANI_U32);
#ifdef TIMER_MANAGER
extern v_UINT_t  tx_timer_create_intern_debug(v_PVOID_t, TX_TIMER*, char *, v_VOID_t(*)(v_PVOID_t, tANI_U32), 
               tANI_U32, v_ULONG_t, v_ULONG_t, v_ULONG_t, char* fileName, v_U32_t lineNum );
#else
extern v_UINT_t  tx_timer_create_intern(v_PVOID_t, TX_TIMER*, char *, v_VOID_t(*)(v_PVOID_t, tANI_U32), tANI_U32, v_ULONG_t, v_ULONG_t, v_ULONG_t);
#endif
extern v_UINT_t  tx_timer_deactivate(TX_TIMER*);
extern v_UINT_t  tx_timer_delete(TX_TIMER*);
extern v_BOOL_t  tx_timer_running(TX_TIMER*);



// Routines needed to initialize and cleanup the Windows wrapper
extern v_VOID_t tx_voss_wrapper_init(v_PVOID_t, v_PVOID_t);

#define schAddDphActivityQueueWin( a, b, c )

// Debug display related globals
extern v_ULONG_t gDbgLevel;
extern v_ULONG_t gDbgMask;
extern int gHalBufCnt;

/* forward declaration From HDDUtil.h used by some internal files */

extern v_U64_t utilGetCurrentTime(void);


#ifdef __cplusplus
}
#endif


#endif



